/* @author cerimice */
package Reportes.PDF.OrdenServicio;

import Persistencia.Definicion.CierreOrdenServicio;
import Reportes.PDF.Formato;
import Sistema.Configuracion;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.vaadin.terminal.StreamResource.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;


public class ReporteGenerarCierreOrdenServicio implements StreamSource
    {
    private Formato                     formato;
    private DecimalFormat               formatoNumero;
    private final ByteArrayOutputStream archivoPDF;
    
    public ReporteGenerarCierreOrdenServicio(List<CierreOrdenServicio> cierres, Date fechaInicio, Date fechaFinal) throws Exception
        {
        formato         = new Formato();
        formatoNumero   = new DecimalFormat("#,###,##0.00");
        archivoPDF      =  new ByteArrayOutputStream();
        this.generarReporte(cierres,fechaInicio,fechaFinal);
        }
    
    private void generarReporte(List<CierreOrdenServicio> cierres, Date fechaInicio, Date fechaFinal) throws Exception
        {
        Document document = null;
        try
            {
            document = new Document(PageSize.LETTER,10,10,10,10);
            PdfWriter.getInstance(document,archivoPDF);
            document.open();
                document.add(formato.generarEncabezado("CIERRE DE ORDENES DE SERVICO"));
                document.add(generarTitulo(fechaInicio,fechaFinal));
                document.add(generarCuerpo(cierres));
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        finally
            {if (document != null){document.close();}}
        }
    
    private Paragraph generarTitulo(Date fechaInicio, Date fechaFinal)
        {
        Paragraph titulo = new Paragraph();
            titulo.add(new Paragraph("Fecha de creación: "+ Configuracion.getFormatoFechaLarga().format(new Date()), formato.getFuenteSubtitulo()));
            titulo.add(new Paragraph("Reporte del: "+ Configuracion.getFormatoFechaCorta().format(fechaInicio) +" al " + Configuracion.getFormatoFechaCorta().format(fechaFinal)+"\n", formato.getFuenteSubtitulo()));
            titulo.setAlignment(Element.ALIGN_CENTER);
        return titulo;
        }
    
    private Paragraph generarCuerpo(List<CierreOrdenServicio> cierres) throws Exception
        {
        try
            {
            float totalManoObra=0,totalRefacciones=0;
            
            Paragraph cuerpo = new Paragraph();
                PdfPTable datosOrdenes = new PdfPTable(6);
                    datosOrdenes.addCell(new Paragraph("FOLIO",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("FECHA",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("TICKET",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("MANO DE OBRA",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("REFACCIONES",formato.getFuenteTitulo()));
                    datosOrdenes.addCell(new Paragraph("TOTAL",formato.getFuenteTitulo()));
                    
                    for(CierreOrdenServicio obj:cierres)
                        {
                        datosOrdenes.addCell(new Paragraph(obj.getClave(),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(Configuracion.getFormatoFechaCorta().format(obj.getFecha()),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(obj.getTicket(),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(formatoNumero.format(obj.getMontoManoObra()),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(formatoNumero.format(obj.getMontoRefacciones()),formato.getFuenteTexto()));
                        datosOrdenes.addCell(new Paragraph(formatoNumero.format(obj.getTotal()),formato.getFuenteTexto()));
                        totalManoObra += obj.getMontoManoObra();
                        totalRefacciones += obj.getMontoRefacciones();
                        }
                    
                    datosOrdenes.addCell(new Paragraph("TOTALES",formato.getFuenteSubtitulo()));
                    datosOrdenes.addCell(new Paragraph("",formato.getFuenteSubtitulo()));
                    datosOrdenes.addCell(new Paragraph("",formato.getFuenteSubtitulo()));
                    datosOrdenes.addCell(new Paragraph(formatoNumero.format(totalManoObra),formato.getFuenteSubtitulo()));
                    datosOrdenes.addCell(new Paragraph(formatoNumero.format(totalRefacciones),formato.getFuenteSubtitulo()));
                    datosOrdenes.addCell(new Paragraph(formatoNumero.format(totalManoObra+totalRefacciones),formato.getFuenteSubtitulo()));

                    cuerpo.add(datosOrdenes);
            return cuerpo;
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }

    @Override
    public InputStream getStream()
        {return new ByteArrayInputStream(archivoPDF.toByteArray());}
    }